package partyBrookerHameln;
/**
 * Die Klasse Datum dient neben der Speicherung von Datum und Uhrzeit auch der
 * Berechnung der Differenz um verpätete Tage zu errechnen und dem verstellen
 * des Datums um eine bestimmte Stundenzahl. Ein Jahr hat immer 360 Tage. Ein
 * Monat hat immer 30 Tage. Eine Woche hat immer 7 Tage. Ein Tag hat immer 24
 * Stunden.
 *
 *
 */
public class Datum {

	private int jahr;
	private int monat;
	private int tag;
	private int stunde;

	/**
	 * Erzeugt ein frei wählbares Datum. Dabei werden Jahr, Monat, Tag und
	 * Uhrzeit (in Stunden) übergeben.
	 * 
	 * @param jahr
	 *            Int
	 * @param monat
	 *            Int
	 * @param tag
	 *            Int
	 * @param stunde
	 *            Int
	 */
	public Datum(int jahr, int monat, int tag, int stunde) {
		this.jahr = jahr;
		this.monat = monat;
		this.tag = tag;
		this.stunde = stunde;
	}

	/**
	 * Erzeugt ein neues Datum, das die gleichen Daten wie das übergebene Datum
	 * hat.
	 * 
	 * @param date
	 *            Datum
	 */
	public Datum(Datum date) {
		this.jahr = date.getJahr();
		this.monat = date.getMonat();
		this.tag = date.getTag();
		this.stunde = date.getStunde();
	}

	/**
	 * Erzeugt ein Datum, das auf einem übergebenen Datum basiert, aber um die
	 * übergeben Zeit verschoben in der Zukunft liegt.
	 * 
	 * @param date
	 *            Datum, von dem um die übergebene Zeit abgewichen werden soll
	 * @param zeit
	 *            Stundenzahl, um die das erzeugte Datum vom übergebenen Datum
	 *            abweichen soll
	 */
	public Datum(Datum date, int zeit) {
		jahr = date.getJahr() + zeit / 360;
		monat = date.getMonat() + zeit % 360 / 30;
		tag = date.getTag() + zeit % 360 % 30;
		stunde = date.getStunde();

		jahr = jahr + monat / 12;
		monat = monat % 12;
		monat = monat + tag / 30;
		tag = tag % 30;

	}

	public int getJahr() {
		return jahr;
	}

	public void setJahr(int jahr) {
		this.jahr = jahr;
	}

	public int getMonat() {
		return monat;
	}

	public void setMonat(int monat) {
		this.monat = monat;
	}

	public int getTag() {
		return tag;
	}

	public void setTag(int tag) {
		this.tag = tag;
	}

	public int getStunde() {
		return stunde;
	}

	public void setStunde(int stunde) {
		this.stunde = stunde;
	}

	/**
	 * Setzt das Datum um die übergebene Anzahl von Stunden weiter.
	 * 
	 * @param stunden
	 *            Int Stunden, die vorgestellt werden sollen
	 */
	public void stundevor(int stunden) {
		int aktuelleStunden = 0;
		aktuelleStunden = this.getJahr() * 360 + (this.getMonat() - 1) * 30 + this.getTag() - 1;
		aktuelleStunden = aktuelleStunden * 24 + this.getStunde();
		aktuelleStunden = aktuelleStunden + stunden;
		this.setStunde(aktuelleStunden % 24);
		aktuelleStunden = aktuelleStunden / 24;
		this.setJahr(aktuelleStunden / 360);
		aktuelleStunden = aktuelleStunden % 360;
		this.setMonat(aktuelleStunden / 30 + 1);
		aktuelleStunden = aktuelleStunden % 30;
		this.setTag(aktuelleStunden + 1);
	}

	/**
	 * Berechnet die Differenz in Tagen, die zwischen diesem Objekt und dem
	 * übergebenen Objekt liegt.
	 * 
	 * @param date
	 *            Vergleichsdatum
	 * @return Ganzzahlige Differenz in Tagen
	 */
	public int differenzBerechnen(Datum date) {
		int aktuelleStunden = 0, alteStunden = 0, ausgelieheneStunden = 0, ausgelieheneTage = 0;
		aktuelleStunden = date.getJahr() * 360 + date.getMonat() * 30 + date.getTag();
		aktuelleStunden = aktuelleStunden * 24 + date.getStunde();
		alteStunden = this.getJahr() * 360 + this.getMonat() * 30 + this.getTag();
		alteStunden = alteStunden * 24 + this.getStunde();
		ausgelieheneStunden = aktuelleStunden - alteStunden;
		ausgelieheneTage = ausgelieheneStunden / 24;
		if (ausgelieheneStunden % 24 != 0) {
			ausgelieheneTage++;
		}
		return ausgelieheneTage;
	}

	public String toString() {
		return tag + "." + monat + "." + jahr + " " + stunde + " Uhr";
	}

}
